package com.wing.light.exceltostf;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.ArrayList;
import java.util.StringTokenizer;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class ExcelToSTF {
	String oPath = null;
	static int totalNum = 0;

	/**
	 * 使用POI将xls或者xlsx文件转换成stf格式的文件
	 * 
	 * @param args
	 * @throws IOException
	 * @throws InvalidFormatException
	 */
	public static void main(String[] args) throws IOException,
			InvalidFormatException {
		// TODO Auto-generated method stub
		ExcelToSTF work = new ExcelToSTF();
		work.excelToSTF();
	}

	public void excelToSTF() throws IOException, InvalidFormatException {
		String initPath = "C:" + File.separator + "initPath.txt";
		ArrayList<File> files = initFilePath(initPath);
		for (int i = 0; i < files.size(); i++) {
			InputStream inp = new FileInputStream(files.get(i));
			Workbook wb = WorkbookFactory.create(inp);
			for (int j = 0; j < wb.getNumberOfSheets(); j++) {
				Sheet st = wb.getSheetAt(j);
				String stfName = null;
				File stfFile = null;
				if (st.getPhysicalNumberOfRows() > 1) {
					totalNum++;
					stfName = oPath.trim() + File.separator
							+ files.get(i).getName() + "_" + st.getSheetName()
							+ ".stf";
					stfFile = new File(stfName);
					Writer wr = new FileWriter(stfFile);
					System.out.println("开始写入第"+totalNum+"个文件：" + stfFile.getName());
					writeHeader(st, stfFile, wr);
					writeData(st, stfFile, wr);
					System.out.println("第"+totalNum+"个文件："+stfFile.getName() + "写入完成。\n");
					wr.close();
				} else if (st.getPhysicalNumberOfRows() == 1) {
					System.out.println(files.get(i).getName() + "中的"
							+ st.getSheetName() + "表只有一行数据，请检查该表。");
				}
			}
		}
		System.out.println("所有文件转换已经完成，一共写入了"+totalNum+"个文件。");
	}

	/**
	 * 获得初始化用的文件并解析； 如果输入文件夹存在则继续，否则退出； 如果输出文件夹存在则直接使用，否则创建该文件夹；
	 * 
	 * 返回输入文件夹下的xls或xlsx文件。
	 * */
	public ArrayList<File> initFilePath(String initFilePath) throws IOException {
		File initFile = new File(initFilePath);
		if (!initFile.exists()) {
			System.out.println("C盘根目录下没有initPath.txt文件，请确认。");
			return null;
		}
		InputStream input = new FileInputStream(initFile);
		byte b[] = new byte[1024];
		input.read(b);
		input.close();
		StringTokenizer str = new StringTokenizer(new String(b));
		String iPath = str.nextToken(); // 输入路径
		oPath = str.nextToken(); // 输出路径
		File inputPath = new File(iPath);
		File outputPath = new File(oPath);
		if (!inputPath.exists()) {
			System.out.println("输入文件夹" + iPath + "不存在，请检查。");
			return null;
		}
		if (!outputPath.exists()) {
			System.out.println("输出文件夹" + oPath.trim() + "不存在，将会被创建。");
			outputPath.mkdir();
		}
		ArrayList<File> files = new ArrayList<File>();

		File[] files2 = inputPath.listFiles();

		// 只返回文件夹下的xls或者xlsx文件
		for (File file : files2) {
			if (file.getName().endsWith(".xls")
					|| file.getName().endsWith(".xlsx")) {
				files.add(file);
			}
		}
		return files;
	}

	/**
	 * 生成stf文件的头文件，包括字段数量、字段名称和字段类型。数值型显示real，字符型显示string
	 * 
	 * @param wb
	 *            正在读取的Sheet表
	 * @param stfFile
	 *            正在写入的stf文件
	 * @param wr
	 *            文件写入流
	 * @throws IOException
	 */
	protected void writeHeader(Sheet wb, File stfFile, Writer wr)
			throws IOException {
		if (wr != null) {
			wr.write(String.valueOf(wb.getRow(0).getPhysicalNumberOfCells()));
			wr.write("\n");
			Row fRow = wb.getRow(0);
			Row sRow = wb.getRow(1);
			for (int i = 0; i < sRow.getPhysicalNumberOfCells(); i++) {
				wr.write(fRow.getCell(i).getStringCellValue());
				wr.write("\t");
				Cell cell = sRow.getCell(i);
				if (cell.getCellType() == 0) {
					wr.write("real");
				} else if (cell.getCellType() == 1) {
					wr.write("string");
				}
				wr.write("\n");
			}
		}
	}

	/**
	 * 生成stf文件的数据部分
	 * 
	 * @param wb
	 *            正在读取的Sheet表
	 * @param stfFile
	 *            正在写入的stf文件
	 * @param wr
	 *            文件写入流
	 * @throws IOException
	 * @throws IOException
	 */
	protected void writeData(Sheet wb, File stfFile, Writer wr)
			throws IOException {
		for (int i = 1; i < wb.getPhysicalNumberOfRows(); i++) {
			for (int j = 0; j < wb.getRow(i).getPhysicalNumberOfCells(); j++) {
				Cell cell = wb.getRow(i).getCell(j);
				if (cell.getCellType() == 0) {
					wr.write(String.valueOf(cell.getNumericCellValue()));
				} else if (cell.getCellType() == 1) {
					wr.write(cell.getStringCellValue());
				}
				if (j < wb.getRow(i).getPhysicalNumberOfCells() - 1) {
					wr.write("\t");
				}
			}
			if (i < wb.getPhysicalNumberOfRows() - 1) {
				wr.write("\n");
			}
		}
	}
}
